package mx.edu.itesm.daai.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import mx.edu.itesm.daai.dao.dto.EdificioDTO;
import mx.edu.itesm.daai.dao.dto.UserDTO;

/**
 *
 * @author Shadow-Xtar
 * Clase que hace conexión a nuestra base de datos y ejecuta los queries
 */
public class DAO {
    
     
    public String CCMVIRTUAL_DS="java:comp/env/jdbc/ccmvirtual";
    public String AUTHENTICATEUSER = "SELECT * FROM usuarios WHERE usuario = ? AND contrasenia = ?";
    public String INSERTUSER = "INSERT INTO usuarios VALUES (null,?,?,?,?)";
    public String FINDEDIFICIO = "SELECT * FROM edificios WHERE edificio = ? AND piso = ?";
    public UserDTO user;
    public EdificioDTO edi;
  /**
   * 
   * @param usr = String
   * @param pwd = String
   * @return user
   *  * Método que realiza la conexión, realiza el query para buscar el usuario y ver si el password 
     * es correcto para poder entrar a la aplicación
   */     
   public UserDTO authenticateUser (String usr, String pwd){

            PreparedStatement stmt;

             try {
            
            user = new UserDTO();

            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup(CCMVIRTUAL_DS);
            Connection conn = ds.getConnection();
            stmt = conn.prepareStatement(AUTHENTICATEUSER);
            stmt.setString(1, usr);
            stmt.setString(2, pwd);
            System.out.println(stmt);
            ResultSet rs = stmt.executeQuery();

            if(rs.next()){
                
            user.setIdUsuario(rs.getInt(1));
            user.setNombreUsuario(rs.getString(2));
            user.setApellidoUsuario(rs.getString(3));
            user.setUsuario(rs.getString(4));
            user.setContrasenia(rs.getString(5));  
            
            }
            
            conn.close();
            
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
            return user;
    }
  
   /**
    * 
    * @param udto
    * Método que realiza el query para insertar un nuevo usuario a la base de datos
    */
    public void insertUser(UserDTO udto){
        PreparedStatement stmt;
        
        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup(CCMVIRTUAL_DS);
            Connection conn = ds.getConnection();
            stmt = conn.prepareStatement(INSERTUSER);
            stmt.setString(1, udto.getNombreUsuario());
            stmt.setString(2,udto.getApellidoUsuario());
            stmt.setString(3,udto.getUsuario());
            stmt.setString(4, udto.getContrasenia());
			
            stmt.executeUpdate();
			
            conn.close();
                        
	} catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException e) {
	// TODO Auto-generated catch block
            e.printStackTrace();
	}
       }

    /**
     * 
     * @param edif
     * @param piso
     * @return EdificioDTO
     * Método con el que se hace la búsqueda de los edificios en la base de datos
     */
    public EdificioDTO findEdicicio(String edif, int piso){
        PreparedStatement stmt;
        
        try {
            
            edi = new EdificioDTO();
            
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup(CCMVIRTUAL_DS);
            Connection conn = ds.getConnection();
            stmt = conn.prepareStatement(FINDEDIFICIO);
            stmt.setString(1, edif);
            stmt.setInt(2, piso);
            System.out.println(stmt);
            ResultSet rs = stmt.executeQuery();

            if(rs.next()){
                
                edi.setEdificio(rs.getString(1));
                edi.setPiso(rs.getInt(2));
                edi.setDescripcion(rs.getString(3));
            
            }
            conn.close();
                        
	} catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException e) {
	// TODO Auto-generated catch block
            e.printStackTrace();
	}
        return edi;
       }
}
